home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / makebin.com / MAKEBIN.ASM < prev    next >
Encoding:
Assembly Source File  |  1989-04-16  |  8.1 KB  |  400 lines

  1.  
  2. ;MAKEBIN HEADER; COMPILE WITH SEATTLE ASSEMBLER
  3. ;MAKEBIN HEADER  V1.01  Copyright 1989  Michael Day   as of 16 April 1989
  4.  
  5. FILSIZE EQU 2
  6. ITEMCNT    EQU 6
  7. HDRSIZE    EQU 8
  8. STKSEG    EQU 0EH
  9. STKOFF    EQU 10H
  10. CODEOFF    EQU 14H
  11. CODESEG    EQU 16H
  12. RELITEM    EQU 18H
  13.  
  14. ;FLAGS,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP,SP,SS
  15.  
  16.     ORG 0        ;WE ASSUME THAT WE WILL BE LOADED 
  17. ENTRY:            ;ON A SEGMENT BOUNDRY
  18.     SEG CS
  19.     MOV [OLDDS],DS    ;SAVE CURRENT DS
  20.     PUSH CS        ;THEN UPDATE IT TO OUR CS
  21.     POP DS
  22.     MOV [OLDSS],SS
  23.     MOV [OLDSP],SP
  24.     MOV [OLDBP],BP
  25.     MOV [OLDES],ES
  26.     MOV [OLDDI],DI
  27.     MOV [OLDSI],SI    ;SAVE ALL REGISTERS
  28.     MOV [OLDDX],DX
  29.     MOV [OLDCX],CX
  30.     MOV [OLDBX],BX
  31.     MOV [OLDAX],AX
  32.     PUSHF
  33.     POP AX
  34.     MOV [OLDFLGS],AX
  35.  
  36.     MOV AX,[BIPC]  
  37.     OR AX,AX        ;CHECK IF ALREADY CONVERTED
  38.     JZ FIXUP
  39.     JMP MAKPSP        ;ALREADY CONVERTED, SO JUST DO IT
  40.  
  41. FIXUP:
  42.     MOV SI,FILEBEG
  43.     MOV DX,SI        ;SI POINTS AT EXE HEADER
  44.     MOV CL,4
  45.     ROR DX,CL        ;DX CONTAINS NEW BASE SEGMENT
  46.     AND DX,0FFFH
  47.     MOV AX,CS
  48.     ADD DX,AX
  49.     ADD DX,[SI+HDRSIZE]
  50.     MOV CX,[SI+ITEMCNT]    ;NUMBER OF SEGMENTS TO CONVERT
  51.     MOV BX,[SI+RELITEM]    ;BX POINTS AT ITEM TO CONVERT
  52.     ADD BX,SI 
  53.  
  54.     MOV AX,[SI+CODESEG]
  55.     ADD AX,DX
  56.     MOV [WRKCS],AX
  57.     MOV [EXECS],AX
  58.     MOV AX,[SI+CODEOFF]    ;SET FAR CALL ADDRESS
  59.     MOV [WRKIP],AX
  60.     MOV [EXEIP],AX
  61.  
  62.     MOV AX,4942H
  63.     MOV [BIPC],AX        ;MARK THE HEADER
  64.     MOV AX,4350H        ;CONVERT = NON-ZERO 
  65.     MOV [BIPC2],AX    ;INDICATES IT IS CONVERTED
  66.  
  67. MAKREL:
  68.     LES DI,[BX]    ;MANGLE THE CODE TO GET THE 
  69.     MOV AX,ES    ;SEGMENT ADDRESSES RIGHT 
  70.     ADD AX,DX
  71.     MOV ES,AX 
  72.     SEG ES
  73.     ADD [DI],DX
  74.     ADD BX,4
  75.     LOOP MAKREL
  76.  
  77.     MOV AX,[SI+FILSIZE]    ;SAVE PROGRAM SIZE
  78.     MOV [PRGSIZ],AX
  79.  
  80.     MOV AX,[SI+STKSEG]
  81.     ADD AX,DX        ;CREATE THE STACK
  82.     MOV [WRKSS],AX        ;BASED ON THE EXE INFO
  83.     MOV [EXESS],AX
  84.     MOV [BINSS],AX
  85.     MOV AX,[SI+STKOFF]
  86.     MOV [WRKSP],AX
  87.     MOV [EXESP],AX
  88.     MOV [BINBP],AX
  89.  
  90.     SUB DX,16
  91.     MOV [PSPSEG],DX        ;SAVE OUR PSP POINTER
  92.     MOV [BINDS],DX        ;WE WILL POINT DS THERE ON ENTRY
  93. MAKPSP:
  94.     CALL CHGCHK        ;CHECK FOR ENTRY ADR CHANGE
  95.     JNZ SKIPSP        ;WARM ENTRY, DON'T RE-CREATE PSP
  96.  
  97.     MOV DX,[PSPSEG]        ;GET A COPY OF PSP IN DX
  98.     MOV AX,DX        ;CLEAR THE PSP
  99.     SUB AX,2        ;PLUS 32 BYTES BELOW IT
  100.     MOV DS,AX
  101.     XOR BX,BX
  102.     MOV CX,256+16+16    ;CLEAR PSP, MCB, AND WORK AREA
  103. CLRIT:
  104.     MOV B,[BX],0
  105.     INC BX
  106.     LOOP CLRIT
  107.  
  108.     XOR BX,BX
  109.     MOV [BX],DATATAB    ;STORE POINTER TO DATA TABLE
  110.     MOV [BX+2],CS
  111.  
  112.     MOV BX,16
  113.     MOV [BX],5AH        ;DUMMY END MCB
  114.     MOV [BX+1],DX        ;WE ARE THE OWNER
  115.     SEG CS
  116.     MOV AX,[PRGSIZ]
  117.     MOV [BX+3],AX        ;HOW BIG IT IS
  118.  
  119.     MOV DS,DX
  120.     MOV CX,11        ;CLEAR FCB1 & FCB2 AREA
  121.     XOR BX,BX
  122. CLRFCB1:
  123.     MOV B,[BX+5DH],20H
  124.     MOV B,[BX+6DH],20H
  125.     INC BX
  126.     LOOP CLRFCB1
  127.  
  128.     MOV AH,62H        ;GET CURRENT PSP SEG
  129.     INT 21H            ;IN BX
  130.     MOV CX,15H        ;COPY BEG OF THIER PSP TO OURS
  131.     XOR SI,SI
  132.     CALL CPYPSP
  133.  
  134.     SEG CS
  135.     MOV AX,[PRGSIZ]    ;UPDATE THE END OF MEMORY
  136.     MOV CX,ES    ;FOR OUR PSP
  137.     ADD AX,CX    ;LAST SEG = LENGTH OF PRG + CS
  138.     SEG ES
  139.     MOV [2],AX
  140.  
  141.     SEG ES
  142.     MOV B,[80H],1EH    ;SET CMD LINE LENGTH BYTE
  143.  
  144. SKIPSP:
  145.     MOV AH,62H        ;GET CURRENT PSP SEG
  146.     INT 21H            ;IN BX
  147.     SEG CS
  148.     MOV [OLDPSP],BX        ;SAVE CALLERS PSP
  149.  
  150.     MOV CX,45H        ;GET COPY OF CALLER'S ENV, 
  151.     MOV SI,16H        ;HANDLE TABLE, AND PID.
  152.     CALL CPYPSP
  153.  
  154.     MOV AH,50H
  155.     SEG CS
  156.     MOV BX,[PSPSEG]        ;SET DOS TO OUR OWN PSP
  157.     INT 21H
  158.  
  159.     MOV BX,20H
  160.     MOV DI,OLD20    ;SWAP TERMINATE ADDRESS
  161.     MOV AX,INTRET    ;WITH OUR OWN
  162.     CALL SETINT
  163.  
  164.     MOV BX,27H
  165.     MOV DI,OLD27    ;SWAP DOS TSR VECTOR
  166.     MOV AX,INTRET    ;WITH OUR OWN (SAME AS NORMAL EXIT)
  167.     CALL SETINT
  168.  
  169.     MOV BX,21H
  170.     MOV DI,OLD21    ;SWAP DOS INT VECTOR
  171.     MOV AX,MYDOS    ;WITH OUR OWN
  172.     CALL SETINT
  173.  
  174.     PUSH CS
  175.     POP DS
  176.     CMP W,[WRKSS],0        ;DON'T SWITCH IF ZERO
  177.     JZ NOSTACK
  178.     CLI
  179.     MOV SS,[WRKSS]        ;SWITCH THE STACK
  180.     MOV SP,[WRKSP]
  181.     STI
  182. NOSTACK:
  183.     MOV AX,CFRET        ;SAVE OUR RETURN ADDRESS ON STACK
  184.     PUSH CS
  185.     PUSH AX
  186.     PUSH [WRKCS]        ;PUSH EXE ENTRY ON STACK
  187.     PUSH [WRKIP]
  188.     MOV BP,[BINBP]        ;SET UP BP TO POINT AT WHERE-EVER
  189.     MOV ES,[PSPSEG]        ;SET UP ES TO POINT AT PSP
  190.     MOV DS,[BINDS]        ;SET UP DS TO POINT AT WHERE-EVER
  191.     RET L            ;ENTER THE EXE PRG VIA STACK
  192.  
  193. ;---------------------------------------------------------------
  194. ; upon completion of the EXE program we return to here
  195.  
  196. CFRET:
  197.     SEG CS        ;FAR CALL RETURN
  198.     MOV [BINDS],DS    ;SAVE CURRENT DS FOR RE-ENTRY
  199. WARMRET:
  200.     SEG CS        ;WARM START = ENTRY POINT WAS CHANGED
  201.     MOV [WRKSS],SS    ;USE THE CURRENT STACK FOR WARM RE-ENTRY
  202.     SEG CS
  203.     MOV [WRKSP],SP
  204. DORET:
  205.     SEG CS
  206.     MOV [BINBP],BP    ;ALSO SAVE BP
  207.     SEG CS
  208.     MOV [BINSS],SS    ;SAVE OUR STACK SEG TOO
  209.  
  210.     MOV BX,20H
  211.     MOV DI,OLD20    ;RESTORE OLD INT 20H
  212.     CALL CLRINT
  213.  
  214.     MOV BX,21H
  215.     MOV DI,OLD21    ;RESTORE OLD INT 21H
  216.     CALL CLRINT
  217.  
  218.     MOV BX,27H
  219.     MOV DI,OLD27    ;RESTORE OLD INT 27H
  220.     CALL CLRINT
  221.  
  222.     MOV AH,50H
  223.     SEG CS
  224.     MOV BX,[OLDPSP]    ;RESTORE CALLERS PSP
  225.     INT 21H
  226.  
  227.     PUSH CS
  228.     POP DS
  229.     CLI
  230.     MOV SS,[OLDSS]
  231.     MOV SP,[OLDSP]
  232.     STI
  233.     MOV BP,[OLDBP]
  234.     MOV ES,[OLDES]
  235.     MOV DI,[OLDDI]
  236.     MOV SI,[OLDSI]    ;RESTORE ALL REGISTERS
  237.     MOV DX,[OLDDX]
  238.     MOV CX,[OLDCX]
  239.     MOV BX,[OLDBX]
  240.     MOV AX,[OLDFLGS] ;RESTORE FLAGS 
  241.     PUSH AX
  242.     POPF
  243.     MOV AX,[OLDAX]
  244.     MOV DS,[OLDDS]    ;RESTORE DS
  245.     RET L        ;AND GO HOME
  246.  
  247. INTRET:
  248.     SEG CS
  249.     MOV [BINDS],DS    ;SAVE CURRENT DS FOR RE-ENTRY
  250.     PUSH CS
  251.     POP DS
  252.     CALL CHGCHK    ;CHECK FOR ENTRY ADR CHANGE
  253.     JNZ WARMRET    ;WARM START IF CHANGED]
  254.  
  255.     MOV AX,[PSPSEG]    ;IT WAS A COLD RETURN,
  256.     MOV [BINDS],AX    ;SO RESTORE ALL REGISTERS
  257.     MOV AX,[EXESS]    ;TO START UP CONDITION
  258.     MOV [WRKSS],AX
  259.     MOV AX,[EXESP]
  260.     MOV [WRKSP],AX
  261.     JMP DORET
  262.  
  263. DOMEM:
  264.     MOV AX,8
  265.     XOR BX,BX    ;TELL THEM THEY CAN'T ALLOCATE MEMORY
  266.     STC
  267.     IRET
  268.  
  269. MYDOS:
  270.     CMP AH,0    ;ZERO TERMINATE
  271.     JZ INTRET
  272.     CMP AH,4CH    ;ALTERNATE TERMINATE
  273.     JZ INTRET
  274.     CMP AH,31H    ;TSR TERMINATE
  275.     JZ INTRET
  276.     CMP AH,48H    ;ALLOC MEM
  277.     JZ DOMEM
  278.     CMP AH,49H    ;FREE MEM
  279.     JZ DOMEM
  280.     CMP AH,4AH    ;MODIFY MEM
  281.     JZ DOMEM
  282.     CMP AH,4BH    ;LOAD AND EXEC
  283.     JZ DOMEM
  284.  
  285.     SEG CS
  286.     PUSH [OLD21S]    ;PUSH OLD DOS ENTRY ON STACK
  287.     SEG CS
  288.     PUSH [OLD21]
  289.     RET L        ;AND RETURN TO IT
  290.  
  291. ;COPY ALL OR PART OF CALLER'S PSP
  292. ;NOTE THAT OUR PSP IS NOT A CHILD PSP, BUT RATHER 
  293. ;AN INDEPENDANT COPY OF THE PARENT PSP. 
  294. CPYPSP:
  295.     CLD
  296.     MOV DS,BX
  297.     SEG CS
  298.     MOV ES,[PSPSEG]
  299.     MOV DI,SI
  300.     REP
  301.     MOVSB
  302.     RET
  303.  
  304. ;CHECK IF ENTRY ADDRESS WAS CHANGED
  305. CHGCHK:
  306.     MOV AX,[WRKCS]    ;IF THEY CHANGED THE ENTRY, THEN
  307.     CMP AX,[EXECS]    ;WE DO A WARM RESTART INSTEAD
  308.     JNZ CHGRET
  309.     MOV AX,[WRKIP]
  310.     CMP AX,[EXEIP]
  311. CHGRET:
  312.     RET
  313.  
  314. ;SWAP INTERRUPT VECTOR
  315. SETINT:
  316.     XOR CX,CX    ;DS POINTS AT INT VECTORS
  317.     MOV DS,CX
  318.     ADD BX,BX    ;BX = INT NUMBER
  319.     ADD BX,BX
  320.     LES CX,[BX]    ;GET CURRENT VALUE 
  321.     SEG CS
  322.     MOV [DI],CX    ;SAVE IT IN MEMORY  DI = SAVE ADDR
  323.     SEG CS
  324.     MOV [DI+2],ES
  325.     CLI
  326.     MOV [BX],AX    ;SET NEW VALUE AX = OFFSET
  327.     MOV [BX+2],CS
  328.     STI
  329.     RET
  330.  
  331. ;RESTORE INTERRUPT VECTOR
  332. CLRINT:
  333.     XOR CX,CX    ;DS POINTS AT INT VECTORS
  334.     MOV DS,CX
  335.     ADD BX,BX    ;BX = INT NUMBER
  336.     ADD BX,BX
  337.     SEG CS
  338.     LES CX,[DI]    ;RECOVER OLD VALUE FROM MEM
  339.     CLI
  340.     MOV [BX],CX    ;RESTORE OLD VECTOR CX = OFFSET
  341.     MOV [BX+2],ES    ;ES = SEGMENT
  342.     STI
  343.     RET
  344.  
  345. ;*********************************************************
  346. ;THIS TABLE MUST REMAIN IN THIS ORDER FOR EXTERNAL ACCESS
  347.  
  348. DATATAB EQU $
  349.  
  350. BIPC    DW 0    ;LOADER ID
  351. BIPC2    DW 0    ;CONVERSION FLAG (0 = NOT CONVERTED)
  352. OLDFLGS    DW 0    ;CALLERS REGISTERS
  353. OLDAX    DW 0
  354. OLDBX    DW 0
  355. OLDCX    DW 0
  356. OLDDX    DW 0
  357. OLDSI    DW 0
  358. OLDDI    DW 0
  359. OLDDS    DW 0
  360. OLDES    DW 0
  361. OLDBP    DW 0
  362. OLDSP    DW 0    ;CALLERS STACK OFFSET
  363. OLDSS    DW 0    ;CALLERS STACK SEGMENT
  364. WRKIP    DW 0    ;POINTER TO CODE ENTRY 
  365. WRKCS    DW 0
  366. WRKSP    DW 0    ;OUR STACK OFFSET
  367. WRKSS    DW 0    ;OUR STACK SEGMENT
  368.  
  369. BINDS    DW 0    ;OUR OWN DS ON EXIT
  370. BINBP    DW 0    ;OUR OWN BP ON EXIT
  371. BINSS    DW 0    ;LAST KNOW STACK SEG
  372. EXEIP    DW 0    ;ORIGINAL EXE ENTRY OFFSET
  373. EXECS    DW 0    ;ORIGINAL EXE ENTRY SEGMENT
  374. EXESP    DW 0    ;ORIGINAL EXE STACK OFFSET
  375. EXESS    DW 0    ;ORIGINAL EXE STACK SEGMENT
  376. PSPSEG    DW 0    ;OUR PSP SEG
  377. OLDPSP    DW 0    ;PREV PSP SEG
  378. PRGSIZ    DW 0    ;SIZE OF PROGRAM FILE IN PARAGRAPHS (SEG)
  379.  
  380.  
  381. ;**********************************************************
  382. ;END OF FIXED TABLE ACCESS
  383.  
  384. OLD20    DW 0    ;PREV INT 20 OFFSET
  385. OLD20S    DW 0    ;PREV INT 20 SEGMENT
  386. OLD21    DW 0    ;PREV INT 21 OFFSET
  387. OLD21S     DW 0    ;PREV INT 21 SEGMENT
  388. OLD27    DW 0    ;PREV INT 27 OFFSET
  389. OLD27S    DW 0    ;PREV INT 27 SEGMENT
  390.  
  391.  
  392.     DS 256+16+16    ;MINIMAL STORAGE AREA FOR PSP+MCB+MISC
  393. PRGEND    EQU $        ;MINIMUM HEADER SIZE NEEDED 
  394.  
  395. LAST    EQU 400H    ;MAKE THIS AT A SEGMENT BOUNDRY PAST PRGEND
  396.  
  397. FILEBEG    EQU LAST    ;EXE IS LOADED AT SEGMENT BOUNDRY
  398.  
  399.     END
  400.